package com.gta.edu.sdk.base.dao;

import java.util.List;

import com.gta.edu.sdk.common.dto.Page;
import com.gta.edu.sdk.common.dto.Sort;
import com.gta.edu.sdk.mybatis.common.Entity;

/**
 * @description 通用数据访问接口
 * @author fengya
 * @2017年5月18日
 */
public interface IBaseDao<T> {
	
	/**
	 * @description 实现对实体类进行添加操作
	 * @author fengya
	 * @date 2017年6月26日 上午11:24:14
	 * @param entity
	 * @return void
	 */
	void save(Entity entity);
	
	/**
	 * @description 实现对实体类的更新操作
	 * @author fengya
	 * @date 2017年6月26日 上午11:35:21
	 * @param entity
	 * @return void
	 */
	void update(Entity entity);
	
	/**
	 * @description 根据ID进行判断是插入操作还是更新操作，ID为空是插入，非空是更新操作
	 * @author fengya
	 * @date 2017年6月26日 上午11:36:09
	 * @param entity
	 * @return void
	 */
	void saveOrUpdate(Entity entity);
	
	/**
	 * @description 只根据对象中的ID进行记录的删除操作
	 * @author fengya
	 * @date 2017年6月26日 上午11:38:50
	 * @param cls
	 * @param id
	 * @return void
	 */
	void delete(Class<? extends Entity> cls,String id);
	
	/**
	 * @description 查询实体类cls下所有的表中数据对象
	 * @author fengya
	 * @date 2017年6月2日 下午4:18:51
	 * @param cls 实体类
	 * @param isDefaultSort 是否支持默认排序，默认排序字段是：UPDATE_TIME
	 * @param sort 是否支持其他字段的排序
	 * @param isDefaultDel 是否支持去除删除掉的数据，依据：DEL_SIGN=0
	 * @return
	 * @throws 
	 * @return List<T>
	 */
	List<T> findAll(Class<T> cls,boolean isDefaultSort,Sort sort,boolean isDefaultDel);
	
	/**
	 * @description 根据sql语句查询所有的记录信息
	 * @author fengya
	 * @date 2020年7月16日 下午4:43:27
	 * @param cls
	 * @param sqlContext
	 * @param sort
	 * @param isDefaultSort
	 * @param parameters
	 * @return
	 * List<E>
	 */
	<E> List<E> findAllBySQL(Class<E> cls, final String sqlContext, final Sort sort, boolean isDefaultSort,final Object... parameters);
	
	/**
	 * @description 根据ID查询对应的对象信息
	 * @author fengya
	 * @date 2017年6月26日 下午5:23:00
	 * @param cls
	 * @param id
	 * @return
	 * @return E
	 */
	<E> E get(Class<E> cls,String id);
	
	/**
	 * @description 对实体类进行分页查询，查询条件是：实体类中属性的值不为空
	 * @author fengya
	 * @date 2017年6月2日 上午11:16:43
	 * @param page
	 * @param sort
	 * @param t
	 * @param isDefaultSort 是否进行默认排序，默认排序是按照UPDATE_TIME进行降序排列，true:默认排序，false:不默认排序
	 * @throws 
	 * @return void
	 */
//	void findAsPage(Page<T> page, Sort sort, T t,boolean isDefaultSort);
	
	/**
	 * @description 分页查询
	 * @author fengya
	 * @date 2020年7月24日 下午4:14:54
	 * @param clazz
	 * @param sqlContext
	 * @param page
	 * @param parameters
	 * void
	 */
	<E> void findPageBySql(Class<E> clazz, final String sqlContext, Page<E> page, final Object... parameters);
}
